package itheima05;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/*
    1.序列化: 把对象写入到文件     写出对象的完整的字节内容,到目的地
        java.io.ObjectOutputStream类:   把对象写入到文件中
        常用方法:
             public void writeObject(Object obj) : 将指定的对象写入  把方法参数obj写入文件

        构造方法:
           public ObjectOutputStream(OutputStream out)
            参数:
              OutputStream out: 字节输出流,抽象父类,传递子类FileOutputStream对象
         使用步骤:
            1.创建字节输出流OutputStream类的子类FileOutputStream对象fos,绑定目标文件
            2.创建一个需要序列化的对象
            3.创建ObjectOutputStream类的对象oos,传递fos
            4.ObjectOutputStream类的对象oos调用writeObject方法,向文件中写出对象
            5.关闭流,释放资源

    2.反序列化: 从文件中读取一个对象出来    读取的是一个对象的完整的字节内容
        java.io.ObjectInputStream类: 从文件中读取出一个对象
         常用方法:
	        public Object  readObject(): 从文件中读取出一个对象,被提升为Object类型

         构造方法:
            public ObjectInputStream(InputStream in)
            参数:
              InputStream in: 字节输入流,抽象父类,传递子类FileInputStream对象

          使用步骤:
            1.创建字节输入流InputStream类的子类FileInputStream对象fis,绑定源文件
            2.创建ObjectInputStream类的对象ois,传递fis
            3.ObjectInputStream类的对象ois调用readObject方法,从文件中读出一个对象
            4.关闭流,释放资源

 */
public class Demo05WriteReadObject {
    public static void main(String[] args) throws Exception {
        writeObject2File();
        readObjectFromFile();
    }
    //反序列化: 从文件中读出一个对象
    private static void readObjectFromFile() throws Exception {
        //1.创建字节输入流InputStream类的子类FileInputStream对象fis,绑定源文件
        FileInputStream fis = new FileInputStream("day12\\info.txt");

        //2.创建ObjectInputStream类的对象ois,传递fis
        ObjectInputStream ois = new ObjectInputStream(fis);

        //3.ObjectInputStream类的对象ois调用readObject方法,从文件中读出一个对象

        Person p = (Person)ois.readObject();

        //4.关闭流,释放资源
        ois.close();
        System.out.println(p);
    }

    //序列化: 把对象写入到文件
    private static void writeObject2File() throws Exception{
        //1.创建字节输出流OutputStream类的子类FileOutputStream对象fos,绑定目标文件
        FileOutputStream fos = new FileOutputStream("day12\\info.txt");

        //2.创建一个需要序列化的对象
        Person p = new Person("张五", 18);

        //3.创建ObjectOutputStream类的对象oos,传递fos
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        //4.ObjectOutputStream类的对象oos调用writeObject方法,向文件中写出对象
        oos.writeObject(p);

        //5.关闭流,释放资源
        oos.close();
    }
}
